function code = classify(buffer, last_index, buff_size, tol, max_range, mu, k)
% 根据缓冲区中的 (x,y) 数据判断动力学状态
%
% 输入参数：
%   buffer    - 循环缓冲区，大小为 [buff_size x 2]，保存最近的 (x,y) 状态
%   last_index- 缓冲区中最后一个状态的索引
%   buff_size - 缓冲区大小（应大于最大检测周期）
%   tol       - 周期检测的容差
%   max_range - 系统的最大范围，用于检测发散情况
%   mu        - 参数 mu
%   k         - 参数 k
%
% 输出参数：
%   code      - 状态代码，含义如下：
%               1  : SP（稳定点，即周期1）
%               2  : P2（周期2）
%               3  : P4（周期4）
%               4  : P8（周期8）
%               5  : MP（多周期，检测到周期但非标准周期2,4,8）
%               6  : QP（准周期）
%               7  : CH（混沌）
%               8  : HC（超混沌，多个正Lyapunov指数）
%               9  : UB（发散，系统变量超出预设范围）

% 判断发散：如果任何状态超过了 max_range
if any(abs(buffer(:)) > max_range)
    code = 9;  % UB：发散
    return;
end

% 取最后状态
final_state = buffer(last_index, :);

% 检测周期：在缓冲区内检测 p=1:(buff_size-1)
period_found = 0;
for p = 1:(buff_size - 1)
    idx_prev = mod(last_index - p - 1, buff_size) + 1;
    if norm(final_state - buffer(idx_prev, :)) < tol
        period_found = p;
        break;
    end
end

if period_found > 0
    % 如果检测到周期，则判断是否为标准周期
    if period_found == 1
        code = 1;  % SP：稳定点
    elseif period_found == 2
        code = 2;  % P2：周期2
    elseif period_found == 3
        code = 5;  % P3 -> MP
    elseif period_found == 4
        code = 3;  % P4：周期4
    elseif period_found == 6
        code = 5;  % P6 -> MP
    elseif period_found == 5
        code = 5;  % P5 -> MP
    elseif period_found == 7
        code = 5;  % P7 -> MP
    elseif period_found == 8
        code = 4;  % P8：周期8
    elseif ismember(period_found, [3, 5, 6, 7])
        code = 5;  % MP：多周期（非标准周期）
    else
        code = 5;  % 其他情况统一归为 MP
    end
else
    % 未检测到周期，使用自相关函数验证周期性
    if autocorr_analysis(buffer(:,1), tol)
        code = 6;  % QP：准周期
    else
        % 计算 Lyapunov 指数，若有两个或更多正指数，则为超混沌
        LEs_result = LEs(buffer, mu, k, 500);  % 计算 Lyapunov 指数，500 步作为稳定性判断
        if sum(LEs_result > 0) >= 2  % 两个以上正的 Lyapunov 指数
            code = 8;  % HC：超混沌
        else
            code = 7;  % CH：混沌
        end
    end
end
end


% 自相关函数分析
function is_periodic = autocorr_analysis(signal, tol)
    % 使用自相关函数（ACF）分析信号周期性
    % 返回值：如果信号具有周期性，返回 true，否则返回 false
    [acf, lags] = xcorr(signal, 'coeff');  % 计算自相关函数
    acf = acf(lags > 0);  % 取正的延迟
    max_corr = max(acf);  % 取最大相关值
    if max_corr > (1 - tol)
        is_periodic = true;  % 认为信号是周期性的
    else
        is_periodic = false;  % 认为信号是混沌的
    end
end
